package com.ziyia.a8_4_1.myview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

public class MyTextView extends TextView {

    private static final String TAG = "--------";
    // 当前字体大小
    private float textSize;
    // 保存两个手指前一次的距离
    private float prevDist;

    public MyTextView(Context context, AttributeSet set) {
        super(context, set);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 只处理触碰点大于或等于2（必须是多点触碰）的情形
        if (event.getPointerCount() >= 2) {
            // 获取该TextView默认的字号大小
            if (textSize == 0) {
                textSize = getTextSize();
            }

            // 对于多点触碰事件，需要使用 getActionMasked 来获取事件类型
            switch(event.getActionMasked()) {
                // 处理手指按下的事件
                case MotionEvent.ACTION_POINTER_DOWN:
                    // 计算两个手指之间的距离
                    prevDist = calSpace(event);
                    break;
                    // 处理手指移动的事件
                    case MotionEvent.ACTION_MOVE:
                        // 实时计算两个手指之间的距离
                        float curVDist = calSpace(event);
                        // 根据两个手指之间的距离计算出缩放比
                        zoom(curVDist / prevDist);
                        // 为下一次移动的缩放做准备
                        prevDist = curVDist;
                        break;
            }
        }
        return true;
    }

    // 缩放TextView字号
    private void zoom(float v) {
        textSize *= v;
        this.setTextSize(px2sp(getContext(), textSize));
    }

    // 将 px 值转换为 sp 值，保存文字大小不变
    private int px2sp(Context context, float textSize) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (textSize / fontScale + 0.5f);
    }
    
    // 计算两个手指之间的距离
    private float calSpace(MotionEvent event) {
        // 两点之间的距离 = 前一个位置 - 后一个位置
        float x = event.getX(0) - event.getX(1);
        // 两点之间的距离 = 前一个位置 - 后一个位置
        float y = event.getY(0) - event.getY(1);
        float sqrt = (float) Math.sqrt(x * x + y * y);
        Log.d(TAG, "calSpace() called with: sqrt = [" + sqrt + "]");
        return sqrt;
    }
}
